home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / docs / asm_guide / assembler course / doctext-assembler < prev    next >
Text File  |  1992-04-27  |  25KB  |  656 lines

  1.  
  2.  
  3.     INTRODUCTION
  4.     ------------
  5.  
  6.     If you ever read a book about assembler, You probably were 
  7.     chased by weird things like carryflag, status register, Program
  8.     counter etc... Maybe you've read about 'Arithmatic & logical unit',
  9.     about 'CPU' and 'STACK'.
  10.     If so, just put it all aside for a while. Most things are very 
  11.     important for the understanding of a computer's way of working,
  12.     but they have very little to do with coding itself. Most things
  13.     will become clear while we're working,...
  14.     If you have never coded anything in your life, you should seriously
  15.     consider something easier to start with, like BASIC. It is rather
  16.     important to know a bit about programming techniques, like loops,
  17.     structured code, subroutines... before you start with assembler.
  18.     Assembler is a second gerneration language, this means that there
  19.     are not much tools to make life easy for the programmer.  For 
  20.     example there's no 'print' instruction in assembler. This doesn't
  21.     make the problem easier for a total beginner...
  22.  
  23.  
  24.     A FIRST PROGRAM
  25.     ---------------
  26.  
  27.     Here follows a first VERY easy program. We'll use this to build
  28.     up our knowledge of assembler. Ofcourse, before you start making 
  29.     demos, you have to know Assembler. Don't worry if you don't get 
  30.     it yet, this will change very rapidly. Here we go:
  31.  
  32.     top:    move.b    #5,d0
  33.     line1:    tst.b    d0
  34.         beq    end
  35.         sub.b    #1,d0
  36.         bra    line1
  37.     end:    rts
  38.  
  39.  
  40.     GENERAL THINGS  - VERY IMPORTANT 
  41.     --------------    - - - - - - - 
  42.  
  43. ** 1    In assembler, we mostly use Hexadecimal or binary numbers rather
  44.     than the normal decimals. This is kinda confusing in the beginning, 
  45.     coz we're used to normal numbers, but in fact it's easy: let's try.
  46.     For example the number 423, let's have a look... Think of the meaning
  47.     of the position of the digits: the '4' in 423 means in fact 4x100 
  48.     (= 4x 10^2), the 2 means 2x10 (=2x 10^1), the 3 means 3x1 (=3x 10^0)
  49.     as you see, each position represents another power of 10. Each digit
  50.     can have a value from 0 to 9. In binary    notation, we have powers of
  51.     2, and each digit can have a value from 0 to 1. 100101 means in fact
  52.     1x2^5, 0x2^4, 0x2^3, 1x2^2, 0x2^1, 1x2^0.   The same thing can be 
  53.     said about 'hexadecimal' numbers: they use powers of 16, each digit
  54.     can have a value from 0 to 15. (0,1,...9,a,b,c,d,e,f)
  55.     You can count for yourself: decimal 10 = hexadecimal a
  56.                     decimal 16 = hexadecimal 10 (1 x 16^1)
  57.                     decimal 2  = binary  10 (1 x 2^1)
  58.                     decimal 4  = binary 100 (1 x 2^2)
  59.                     decimal 5  = binary 101 (1x2^2 + 1x2^0)
  60.     This is ofcourse nice to know, but you can hardly sit donw and count
  61.     each value with powers-of-i-dunno-what, coz it might take HOURS !!!!
  62.     Therefor, we have - luckyly - the ASSEMBLER !!  If you use asmone 
  63.     (you probably do), you can easyly transfer any number from binary 
  64.     to hexadecimal to decimal, or back.  You just tell asmone what kind of
  65.     number you have for him, and he'll do the rest for you. For each 
  66.     special kind there is a special 'MARKER':
  67.  
  68.     BINARY NUMBERS have a '%' preceding:       %1001101011
  69.     HEXADECIMAL NUMBERS use a '$' before them: $38a83b
  70.     DECIMAL NUMBERS have nothing:           12353
  71.  
  72.     $10 is something completely different than %10 or 10 !!!
  73.  
  74.     Later, when you make a program, you can enter any number in the
  75.     notation you want: just put the correct prefix. You'll soon 
  76.     discover that in some cases, hexadecimal notation is prefered, in
  77.     other cases binary notation might be more interesting... It depends.
  78.  
  79. ** 2    Now about BYTES, WORDS and LONGWORDS. 
  80.     A computer's memory is built up of enourmous amounts of bits. These
  81.     are in fact switches, can have 2 states: on or off, 1 or 0. To make
  82.     it all a bit easier to handle, these bits are grouped: if you group
  83.     8 bits, you have a BYTE. 16 bits (2 bytes) are called a WORD, and
  84.     32 bits (2 words, 4 bytes) are called a LONGWORD.
  85.     You can do things with these groups of bits, like putting a certain
  86.     value into them.  It's obvious you can move larger numbers in a 
  87.     LONGWORD than in a word or in a byte.  
  88.     Grouping all these bits into bytes, you get the memory, where each 
  89.     byte has it's own number-in-the-row. This number is the 'addres' of
  90.     this byte. Address 1493 is in fact the 1493th byte in the memory.
  91.     (Addresses are mostly expressed as HEXADECIMAL numbers, like $fc0000)
  92.     Each address contains a value, made up by those bits. For example
  93.     address number $10248 could contain the value 100 (just a silly example)
  94.     In hexadecimal notation, the value of one byte in memory can be 
  95.     between #$00 and #$ff. (decimal: between #0 and #255)
  96.     If you wish to take a word in memory, you just take 2 succesive 
  97.     bytes from memory (for example $10000 & $10001). We say in this case
  98.     that the word is at $10000 (and not $10001) WORDS CAN ONLY START ON
  99.     AN EVEN ADDRESS (so a word can not be for example on $10001 & $10002)
  100.     If address $10000 contains the byte #$34 and address $10001 contains
  101.     the byte #$a8, the WORD at $10000 contains #$34a8.
  102.     Longwords have the same story: only at EVEN ADDRRESSES, but here you
  103.     take 4 bytes in a row. Bytes #$10, #$3a, #$29, #$00 make the LONGWORD
  104.     #$103a2900. You see, to switch between bytes, words and longwords,
  105.     the hexadecimal notation is much easier than the decimal.
  106.     If data in memory is used as WORD or BYTE or LONGWORD is not 
  107.     predefined. It just depends on how you wish to use it.
  108.  
  109. ** 3    Now about the DATA- AND ADDRES-REGISTERS.
  110.     These are zones in the processor where you can temporary store
  111.     data.  In the amiga, there are 8 data and 8 addressregisters: 
  112.     d0, d1,... d7 and a0,a1...a7.  They're used VERY OFTEN.   The 
  113.     special thing about it, and this is in fact an aspect of 
  114.     the hardware, is that they are directly connected to the PROCESSOR,
  115.     where the memory is not. Therefor, the registers can be accessed
  116.     much faster than memory. REGISTERS are also used to store the 
  117.     data that will be used for a mathematical calculation, and once this
  118.     calculation is done, the results will be in the registers again. 
  119.     You can't for example subtract the value in address x from the
  120.     value in address y, and put the results in address z, no, you must
  121.     put the values in the registers first, then perform the subtr, and
  122.     then you'll get the results in the same register. Examples follow
  123.     in some lines. I've to tell you just one thing before that.
  124.  
  125. ** 4    1)    move.l #$1000,d0
  126.     2)    move.l $1000,d0
  127.     Do you see the difference between these 2 lines?  In line 1 is a 
  128.     '#' before the number. 
  129.     LINE 1 MEANS: PUT THE VALUE '$1000' IN DATAREGISTER D0
  130.     LINE 2 MEANS: PUT THE CONTENTS OF ADDRESS $1000 IN DATAREGISTER D0.
  131.     This is ofcourse a big difference.
  132.     If addres $1000 contained the value #$129475, in the second case,
  133.     this value would be moved into D0.
  134.     VALUES ALLWAYS HAVE A '#' PRECEDING. Addresses have nothing.
  135.  
  136.     *******
  137.  
  138.     Now take back the small program. See the 'MOVE.B #5,d0' ?
  139.     You ought to understand everything of it now:
  140.  
  141.     The '.B' means that you're gonna work with only 8 bits in one time.
  142.     (BYTE)
  143.     The # means that a VALUE is about to follow: the value is #5.
  144.     There's no $ or % before the number, which means that the number
  145.     is decimal. (note: decimal 5 and hexadecimal 5 are the same...)
  146.     D0 is a dataregister in which the number will be moved.
  147.  
  148.     So: move.b #5,d0 means: move decimal value 5 into dataregister 0.
  149.         The size of the moved value is 8 bits.
  150.         (note: one register contains 32 bits)
  151.  
  152.     MOVE.L    #$1000,d1
  153.         this means: move the hexadecimal value 1000 in datareg1.
  154.         here you transfer a LONGWORD (32 bits)
  155.  
  156.     MOVE.W    $2000,d1
  157.         now you move the WORD that is stored at address $2000 
  158.         into datareg1. Let's say that the memory looks as follows:
  159.  
  160.         addr:    $1ffe $1fff $2000 $2001 $2002 $2003 $2004
  161.         value:     #$a4  #$4d  #$00  #$48  #$29  #$00  #$35
  162.  
  163.         The value moved to D0 will be in that case: #$0048
  164.         (1 word = 2 bytes, starting from $2000)
  165.         If we moved a longword (move.l $2000,d0) the value would
  166.         be #$00482900
  167.  
  168.     I think the other lines are not to difficult.
  169.  
  170.     Now you know very much already. But there's much more to come...
  171.     You see that we moved the value to a dataregister: D0. That's
  172.     not necessary. We could also move it to an addressreg, or to an
  173.     address in memory.  These are various 'ADDRESSING METHODS', and if
  174.     you use the addressing methods in a clever way, your program can
  175.     be much faster or better... Which are these addressing methods ?
  176.     Let's explain it with an example for each one:
  177.  
  178.     ( '.x' means it can be anything (byte, word or longword)
  179.       #x means a value like #400, #$ffa0 or #%10010101
  180.       addr means an address like $c0000
  181.       Dx means 'any dataregister' (d0 - d7)
  182.       Ax means 'any addressregister' (a0 - a7)
  183.     )
  184.     
  185.     NORMAL ADDRESSINGS (most commonly used, don't know their name)
  186.     - - - - - - - - - 
  187.  
  188.     MOVE.x  #x,addr : move a value to an addres
  189.     MOVE.x  addr,addr : move the contents of an address to another addres
  190.  
  191.     MOVE.x    #x,Dx  : move a value x to a dataregister
  192.     MOVE.x  addr,Dx : move the contents of an address to a dataregister
  193.     MOVE.x  Dx,addr : move the contents of a datareg into an addres
  194.  
  195.     MOVE.x  #x,Ax  : move a value to an addressregister
  196.              since addresses in the AMIGA are 32 bits long,
  197.              most of these kind of moves are LONG (Move.L)
  198.     MOVE.x  addr,Ax: move the contents of an address to an addressreg.
  199.              also most times a longword.
  200.     MOVE.x  Ax,addr:  move the contents of an addrreg into an addres
  201.  
  202.     MOVE.x  Dx,Dy  : move from one datareg into another one
  203.     MOVE.x  Ax,Dy    or from an addressreg into a datareg
  204.     MOVE.x  Dx,Ay     or any other combination you can think of
  205.     ...
  206.  
  207.     INDIRECT ADDRESSING:
  208.     - - - - - - - - - - 
  209.  
  210.     MOVE.x    #x,(Ax)
  211.  
  212.     THIS IS VERY INTERESTING !!!  now you move the value 'x' not into
  213.     the addressregister, (like in 'MOVE.x #x,Ax' ) but into the addres
  214.     that is stored in this addressregister.
  215.     For example if A0 is currently filled with the VALUE #$fc0000,
  216.         MOVE.B #4,(A0)
  217.     would cause the ADDRESS $fc0000 to be filled with the value #4. 
  218.     (This would have the same effect as MOVE.B #4,$fc0000)
  219.     Now you see why A-registers are called ADDRESSregisters. The values
  220.     that are stored in an ADDRESSREGISTER represent ADDRESSES.
  221.     Indirect addressing can only be done with addressregisters,
  222.     so MOVE.x #x,(Dx) isn't allowed. Values stored in a DATAREGISTER
  223.     represent VALUES only.
  224.  
  225.     All combinations are allowed:
  226.     move.x (Ax),Dy
  227.     move.x (Ax),addr
  228.     move.x (Ax),(Ay)
  229.     move.x Dx,(Ay)
  230.     ...
  231.  
  232.     You can also put an OFFSET with the (Ax). If A0 contains $10000
  233.     and you wanna put something in $10004 (which accidently is A0 + #$4)
  234.     you just :    MOVE.x #x,4(A0)
  235.  
  236.     - watch the notation: hexadecimal for example    $a(A0)
  237.       Don't put a '#'  (wrong:   #$a(A0)   )
  238.     - the offset is limited (I dunno exactly how big)
  239.       this would be too large, I suppose:  $102447(A0)
  240.       but this is still OK: $200(A0)
  241.  
  242.  
  243.     INDIRECT ADDRESSING WITH POSTINCREMENT:
  244.     - - - - - - - - - - - - - - - - - - - -
  245.  
  246.     example: MOVE.B #0,(A0)+    
  247.  
  248.     That's another VERY INTERESTING way of addressing. Let's say you
  249.     wish to fill a row of addresses starting from $10000 with value 0.
  250.     Then you put this address in an addressregister, and you use indirect
  251.     addressing WITH 'POSTINCREMENT'.  AFTER THE INSTRUCTION (in this 
  252.     case MOVE), the addressregister will be increased automaticly, so
  253.     that it points to the next byte, word or longword (depending on the
  254.     size: move.b .w or .l)
  255.  
  256.     let's say A0 contains #$10000
  257.     we do a MOVE.L #$2da30,(A0)+
  258.     memory will look like this:
  259.  
  260.     $10000 $10001 $10002 $10003
  261.      #$00    #$02   #$da   #$30
  262.  
  263.     and the value in A0 will be #$10004.
  264.  
  265.     You can't put an offset at the addressreg: WRONG:  MOVE.x #x,4(A0)+
  266.  
  267.  
  268.     Almost the same thing is: IND.ADDR. WITH PREDECREMENT
  269.                   - - - - - - - - - - - - - - 
  270.  
  271.     example: MOVE.B #0,-(A0)
  272.  
  273.     Here, the contents of A0 will be decreased to the first lower
  274.     byte (or word or longword, depending on the size again), and THEN
  275.     the move will be done.
  276.     So, if A0 contains #$5c000:
  277.     MOVE.W #$204a,-(A0)
  278.     will have the following effect:
  279.     A0 will be decreased with 2 (1 word = 2 bytes) making it #$4bffe
  280.     and then #$204a will be put in locations $4bffe & $4bfff
  281.  
  282.     Don't mix up predecrement and negative offsets:
  283.     MOVE.x  #x,-(A0)    ; Ind.addressing with predecrement
  284.     MOVE.x  #x,-4(A0)    ; Ind.addressing with an offset '-4'
  285.  
  286.  
  287.     SPECIAL EXAMPLE OF POSTINC/PREDECR
  288.     - - - - - - - - - - - - - - - - -
  289.  
  290.     MOVEM.L D0-D7/A0-A6,-(A7)
  291.     MOVEM.L (A7)+,D0-D7/A0-A6
  292.             these are 2 special instructions, as you see they
  293.             use postincr and predecr. addressing.
  294.             MOVEM means 'move multiple'. You decrease the value
  295.             in A7, then move D0 to that address, again decrease
  296.             A7, and move D1 in this addres, and so on. 
  297.             The second instruction gets all these values back
  298.             from (A7) and puts them in the registers.
  299.             This way you are able to save the contents of all
  300.             the registers, and get them back after for example
  301.             you performed a subroutine (where you changed them)
  302.             A7 is what is called the STACKPOINTER, in it is the
  303.             address of the 'STACK', a place where important
  304.             values are stored as 'FIRST IN LAST OUT'. If you
  305.             put D0 in it, then D1, then D2, the first value
  306.             that you'll get back is D2, then D1 and then D0.
  307.             This is also used for jumping to subroutines:
  308.  
  309.     main:    bsr    routine
  310.          ...
  311.  
  312.     routine:....
  313.         ...
  314.         rts
  315.  
  316.     The BSR will make the computer save the current address on the stack,
  317.     and when the routine is finished (RTS), this address will be taken
  318.     back from the stack, so the program can continue from where it left.
  319.     (this is done automatically, Don't worry)
  320.  
  321.  
  322.  
  323.     ABOUT RELATIVE ADRESSING
  324.     ------------------------
  325.  
  326.     You surely know that AMIGA is a multitasking computer. That means
  327.     that you can run more programs at 1 time, and so have more than 1
  328.     program in memory at 1 time. If you load a program, it's never sure
  329.     where this program will be. If you just loaded another program, there
  330.     will be no place for this second one on this place, so all depends !!
  331.     A program that is loaded, first tells amiga how much memory it will
  332.     need, amiga checks where he has some room, and he tells the program
  333.     the start of this room. A program can therefor never say for example
  334.     jump to address $10000, because he doesn't know if he will be 
  335.     located there.  The program instead says: jump to (starting location
  336.     + offset):
  337.     $10000:   starting location
  338.     ...
  339.     $12000:   routine
  340.  
  341.     It would be something like : JMP (STARTING LOCATION + $2000)
  342.     BUT !!NOT!!         :    JMP $12000
  343.     because when the program gets loaded an other time, the starting
  344.     location could be for example $14000, putting the routine at $16000.
  345.     The line 'JMP starting location + $2000' however is still valid.
  346.  
  347.     This has it's consequences when using asmone, or any other language on
  348.     AMIGA. You can for example not put a picture on address $70000,
  349.     (although many BAAAAAD coders do this) because you simply don't know
  350.     if there's room on that location.  (don't get it wrong: you CAN do
  351.     it, but it's WRONG. The computer could crash)
  352.  
  353.     LABELS!
  354.     - - - -
  355.  
  356.     In asmone, addresses are given a name: a LABEL. This is very interesting.
  357.     You just give a routine a label, and if you wish to jump to it, you
  358.     say "JMP labelname" instead of JMP addres. (This would be against
  359.     the rules of relative addressing)  When you assemble your source,
  360.     asmone will look where there's room to put it, and change the labels
  361.     into relative addresses. In fact YOU don't have to worry anymore.
  362.     The program we saw earlier contained labels too: 
  363.     Top, Line1, and End are labels. asmone will calculate the correct
  364.     addresses for them when you assemble it.
  365.     In fact, you should replace each word 'addres' in this text with
  366.     the word 'label'.  For example you must
  367.  
  368.     MOVE.x #x,label  instead of   MOVE.x #x,addr
  369.     MOVE.x label,Dx    "     "    MOVE.x addr,Dx
  370.         ....            ....
  371.  
  372.     In the assembling, each command will be translated into a number
  373.     which is the 'RAW' machinecode for this command. (for example:
  374.     jmp will get the number #$4ef9 )   This value is stored somewhere 
  375.     in memory, at a certain location 'starting location + offset'
  376.     Values of successive commands will be put behind eachother in memory.
  377.  
  378.     ************
  379.  
  380.     Now the time is right to again attract your attention to 
  381.     'GENERAL THINGS #4'  (read this part again please)
  382.  
  383.     You should be able to tell me what the difference is between
  384.  
  385.     MOVE.L    LABEL,D0
  386.     MOVE.L    #LABEL,D0
  387.  
  388.     But to be sure, I'll tell you: in the first case, the longword-value
  389.     that is in addresses LABEL, LABEL+1, LABEL+2 and LABEL+3, will be
  390.     put in D0. In the second case, the addressVALUE of LABEL will be put
  391.     in D0. We don't know this address until it is assembled.
  392.  
  393.     some examples on this:
  394.  
  395. *    program:    move.b    data,D0  ; the CONTENTS of 'data'
  396.             rts
  397.     data:          dc.b    10
  398.  
  399.     Now, D0 will contain the byte stored at address 'data' (#10)
  400.  
  401. *    program:    move.l    #data,A0  ; the addresVALUE of 'data'
  402.             move.b    (A0)+,D0
  403.             move.b    (A0),D1
  404.             rts
  405.     data:        dc.b    10,11
  406.  
  407.     first we moved the address 'data' to A0. Then we moved a byte stored
  408.     at (A0) to D0, A0 was increased by one BYTE, and we stored the byte
  409.     at (A0) to D1.  D0 will contain #10, and D1 will contain #11
  410.     Please note: if you put an address into an addresregister, like in 
  411.     the last example, you must use LONGWORD move (MOVE.L) because each
  412.     address is 32 bits long. If you did 'MOVE.B' or 'MOVE.W' you would 
  413.     only have moved a part of the addres, this is not forbidden, but it
  414.     was not    your intention: if the addres of 'data' was  $00073a00, a
  415.     MOVE.W #data,A0 would have caused A0 to be filled with $3a00, which
  416.     is also an address, but not the addres you wanted !!!
  417.     
  418.  
  419.  
  420.     REMARK
  421.     ------
  422.     Dataregs like D0, and addressregs like A0, have a length of 32 bits,
  423.     in other words: LONGWORDS.
  424.     If you move a BYTE or a WORD into these registers, they won't be
  425.     filled up completely. The not filled part of the register isn't
  426.     changed...  example:
  427.  
  428.     D0 contained:     #$12345678  (longword)
  429.     MOVE.B #$00,D0
  430.     now D0 contains:  #$12345600
  431.     MOVE.W #$3333,D0
  432.     now D0 contains:  #$12343333
  433.     MOVE.L #$3333,D0
  434.     now D0 contains:  #$00003333
  435.  
  436.  
  437.     REMARK2
  438.     -------
  439.     Please refer back to General remarks #2. You'll see that a word
  440.     or a longword can only start at EVEN addresses. Now look at this
  441.     program:
  442.  
  443.     start:    move.w    ....
  444.         .....            ; other commands
  445.         .....
  446.  
  447.     data:    dc.b    0        ; 1 byte of data
  448.  
  449.     routine:move.....        ; again commands....
  450.  
  451.     asmone takes care that the starting of this program is at an even
  452.     address, and because all commands are an even number of bytes long,
  453.     all other commands will be put on even addresses too. BUT, now we
  454.     put ONE byte at a certain location. The next commands will start
  455.     on an ODD address, which is forbidden.  One simple mistake like
  456.     this could have caused a 'system crash' if you didn't have asmone.
  457.     asmone ofcourse notices this mistake and says: WORD AT ODD ADDRESS.
  458.     All you have to do is putting the command 'EVEN' behind the data
  459.     that caused the mistake:
  460.  
  461.     data:    dc.b    0
  462.         even
  463.     routine:....
  464.  
  465.     It's best to put 'EVEN' behind each row of DC.B's
  466.  
  467.     This is a similar mistake: (often made, often hard to find)
  468.  
  469.         move.l    #data,A0
  470.         move.l    #otherdata,A1
  471.         move.b    (A0)+,(A1)+
  472.         move.w    (A0)+,(A1)+    ; **** wrong !!
  473.         ...
  474.     data:    dc.b    0,20,12,23,....
  475.         even
  476.     otherdata:
  477.         dc.b    0,0,0,0,....
  478.         even
  479.  
  480.     This program first puts the addresses of 'data' and 'otherdata' in
  481.     2 addressregs.  DATA is at an even addres, correct.  Then it moves 
  482.     a BYTE from the data-row into the 'otherdata' row. The increment
  483.     from MOVE.B (A0)+,(A1)+ will add 1 to the even values in A0 and A1.
  484.     Next we want to move a WORD at (A0) to a WORD at (A1), and you guessed
  485.     right: it won't work... because they are now ODD, and a word can only
  486.     be at an EVEN addres. another MOVE.B (A0)+,(A1)+ would cause no 
  487.     problem.
  488.  
  489.  
  490.  
  491.     SOME MORE COMMANDS
  492.     ------------------
  493.     till now, we've only seen instruction MOVE. Here are some other ones.
  494.     You can use most of the addressing methods on these commands. I don't
  495.     know exactly which are allowed and which not, but you won't use
  496.     most of them after all, and if you accidentally use one that isn't
  497.     allowed, asmone will tell you, and it's just as soon corrected.
  498.     So here we go:
  499.  
  500.     ADD.x  a,b    add a to b, result comes in b.
  501.             (a and b can be #x, label, Ax, Dx, x(Ax), (Ax)+,...)
  502.     SUB.x  a,b    subtract a from b, result in b.
  503.             (idem)
  504.     CMP.x  a,b    compare a with b, a & b can be anything except
  505.             postincement or predecrement (Ax)+, -(Ax)
  506.     TST.x    a    compare a with zero. a can't be an addresregister
  507.  
  508.  
  509.     BSR label    : branch to a subroutine. You'll get back with 'RTS'
  510.     BRA label    : perform an unconditional branch to another location
  511.               in the program. You cannot return with RTS
  512.     BNE label    : branch if not equal (after a CMP or TST)    
  513.     BEQ label    : branch if equal
  514.     BLT, BLE, BGT, BGE: branch if less than, less or equal, greater than,
  515.                 greater or equal.
  516.  
  517.     SWAP Dx        : swap the contents of the lower word and the higher
  518.               word of a dataregister:
  519.  
  520.         D0: $xxxx yyyy
  521.         swap d0
  522.         D0: $yyyy xxxx
  523.  
  524.     moving addresses to an addresregister can be done with
  525.     MOVE.L #label,Ax
  526.     but there's a special command to do it, it's a bit faster:
  527.     LEA.L  label,Ax
  528.     notice that there's no # anymore, only for addr.regs !!
  529.  
  530.  
  531.  
  532.     NOT SO OFTEN USED COMMANDS
  533.     - - - - - - - - - - - - - 
  534.  
  535.     MULU    a,b    multiply a with b (this is a very slow command!)
  536.     DIVU    a,b    divide b by a    (idem, avoid using them!)
  537.     OR.x    a,b    perform a logical OR with a on b
  538.     AND.x    a,b        "         "    AND with a on b
  539.     EOR.x    a,b        "         "      EOR with a on b
  540.     NOT.x    a    perform NOT on a
  541.  
  542.         a    100101011
  543.         b    001100110
  544.  
  545.             ---------
  546.  
  547.         a and b:000100010    the result bit will only be set if
  548.                     bots bits of a AND b were set
  549.  
  550.         or is the same but the result bit will only be set if the 
  551.         bit in a OR the bit in b was set:
  552.  
  553.         a or b:    101101111
  554.  
  555.         xor is EXCLUSIVE OR. only if a bit is set in a AND NOT in b,
  556.         or set in b and not in a, the result will be 1
  557.  
  558.         a eor b:101001101
  559.  
  560.         not moves 1 to 0 and 0 to 1: not (001010)= 110101
  561.  
  562.     BTST    #x,Dx    : check if a bit is equal to zero (in a dataregister)
  563.  
  564.         D0:  10110010 01010111 10010100 00011011
  565.              ^               ^           ^
  566.         bit 31                15           0
  567.  
  568.         BTST #15,D0    ->   not equal !! bit 15 is set !!
  569.  
  570.     BCLR    #x,Dx    : clear a bit in a datareg
  571.     BSET    #x,Dx    : set a bit in a datareg
  572.     ASL.x    #x,D/Ax : shift the bits in Dx or Ax  x times to the left
  573.               if the leftmost was 1, carry will be set
  574.     ASR.x   #x,D/Ax : shift to the right, if rightmost bit was 1, carry
  575.               will be set, else, carry wil be cleared
  576.     BCS, BCC    : branch if carry set/clear
  577.  
  578.  
  579.     I think these are all the commands you'll use. A complete list with
  580.     full details will follow soon, but you don't need it yet. It's full
  581.     with numbers and symbols, it would just make it unoverviewable.
  582.     Please refer to the sources to see some real examples & experiments...
  583.  
  584.  
  585.  
  586.     asmone COMMANDS
  587.     -------------
  588.     You alreqady knew it, but I say it anyway: asmone has 2 states:
  589.     EDITOR STATE and ONLINE STATE...
  590.     If you start Asmone, you get a 'PROMPT', it look like:  'ASM1>'
  591.     You can switch between the editor and back by pressing <ESC>
  592.     
  593.  
  594.     [..] means that this is not necessary
  595.     <label> means you mustn't type 'label' but just a labelname
  596.  
  597.     Here's a list of online-commands:
  598.  
  599.     a       -    assemble the source
  600.  
  601.     j[<label>] -    jump (if you give a labelname, the program will
  602.                 jump to the address which corresponds with
  603.                 the label)
  604.             (you could also enter an address like $30000 instead
  605.             of any label)
  606.     l<string> -    look for a string in the source
  607.     @d<label>  -    disassemble a part of your assembled source,
  608.             starting at <label> (press return to continue)
  609.     @h<label>  -    show memory in ascii & hex starting from a label
  610.     @m<label>  -    modify memory... (not sure)
  611.     e      -    load >extern files... see sources for examples
  612.     t      -    go to the top of the file
  613.     b      -    bottom
  614.     v[<dir>]  -    get the directory of the current directory
  615.             if you give a dir-name, the CD will change to that
  616.             directory & display the contents.
  617.     v <dir>      -    v+space: change the current directory but don't
  618.             show contents.
  619.     r     -    read a source (or show a requester to select one)
  620.     w     -    write source
  621.     wo      -    write the OBJECT (the assembled version, which is 
  622.             executable) to disk
  623.  
  624.     IN EDITOR MODE:
  625.  
  626.     SHIFT UP/DWN-    fast moving in source
  627.     AMI B        -    start a block (to cut/copy)
  628.     AMI C        -    copy block
  629.     AMI X        -    cut block
  630.     AMI I        -   insert block
  631.     SHIFT Fx    -   MARK A POSITION (1..3)
  632.     Fx        -   JUMP TO MARKED POSITION
  633.  
  634.     For more detailed info, see asmone DOCUMENTATION... 
  635.  
  636.  
  637.     ********
  638.  
  639.     I think this is enough for this time...  If you've read all this,
  640.     you've seen nearly each aspect of assembler. I realise this is
  641.     a whole bunch of information, so take your time to understand it.
  642.     It's not easy, though it seems 'NORMAL' for someone who knows it.
  643.     If you've read all this, it's time you'd take a look at the sources,
  644.     where you can experiment and have a look at some results.  The 
  645.     copies will follow soon, but you ABSOLUTELY don't need them yet. 
  646.     First get used to the the language and the characteristics of it.
  647.     I hope you could understand most of this bulshit, if you don't get
  648.     something, or you have questions, just ask me, and I'll try to
  649.     answer...
  650.     NO HAVE A LOOK AT THE SOURCES AND MAKE SOME YOURSELF !!!  TRYING IS
  651.     THE BEST WAY TO LEARN !!!
  652.  
  653.         SEE YOU SOON !  GREETINGS  from
  654.  
  655.                 Geert / EIKENLAAN 21 / 3740 BILZEN / BELGIUM
  656.